package main

import (
	"fmt"
	"math"
	"sort"
	"strconv"
	"strings"
	"time"
)

// 定义三角形属性，内容：底(base)和高(height)
type traingle struct {
	height float32
	base   float32
}

// 定义矩形属性，内容：边长(length)
type rectangle struct {
	length int
}

// 定义圆形属性，内容：半径(radius)
type round struct {
	radius float32
}

// 以map的key和value定义结构体，用来做结构体切片，方便后续排序
type m2 struct {
	diagramer string
	area      float32
}

// 定义图形接口
type diagramer interface {
	area() float32
}

// 计算三角形面积的方法
func (t *traingle) area() float32 {
	return t.base * t.height / 2
}

// 计算矩形面积的方法
func (r *rectangle) area() float32 {
	return float32(r.length) * float32(r.length)
}

// 计算圆形面积的方法
func (r *round) area() float32 {
	value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", math.Pi*r.radius*r.radius), 64)
	return float32(value)
}

func main() {
	fmt.Println("~~~~~~~~~~~~~第1题答案~~~~~~~~~~~~~")
	// make一个空map
	map1 := make(map[string]float32, 3)
	// 接口类型
	var d diagramer
	// 实例化三角形结构体sjx
	sjx := traingle{
		base:   5,
		height: 4,
	}
	// 接口赋值
	d = &sjx
	fmt.Println("三角形面积是：", d.area())
	// map添加元素
	map1["三角形"] = d.area()
	jx := rectangle{
		length: 5,
	}
	d = &jx
	fmt.Println("正方形面积是：", d.area())
	map1["正方形"] = d.area()
	yuan := round{
		radius: 4,
	}
	d = &yuan
	fmt.Println("圆的面积是：", d.area())
	map1["圆形"] = d.area()
	fmt.Println("~~~~~~~~~~~~~第2题答案~~~~~~~~~~~~~")
	fmt.Println("未排序：", map1)
	// 定义一个结构体空切片
	var s1 []m2
	// 遍历map1，将元素写入空切片
	for k, v := range map1 {
		s1 = append(s1, m2{k, v})
	}
	// 切片排序
	sort.Slice(s1, func(i, j int) bool {
		return s1[i].area > s1[j].area
	})
	fmt.Println("排序后：", s1)
	fmt.Println("~~~~~~~~~~~~~第3题答案~~~~~~~~~~~~~")
	// TODO
	fmt.Println("~~~~~~~~~~~~~第4题答案~~~~~~~~~~~~~")
	// 获取当前时间
	var t1 = time.Now()
	// 获取8年前的时间
	beforeYear := t1.AddDate(-8, 0, 0)
	// 格式化获取年份
	later := beforeYear.Format("2006/01/02")
	// 小时和分钟是固定的，创建一个字符串
	h1 := "9:30"
	// 拼接成8年前的今天早上9点30分
	str := later + " " + h1
	layout := "2006/01/02 15:04"
	//fmt.Println(str)
	// 调用时区
	tz, _ := time.LoadLocation("Asia/Shanghai")
	// 将拼接成的时间字符串转为时间格式
	t2, _ := time.ParseInLocation(layout, str, tz)
	fmt.Println("毫秒时间戳：", t2.UnixMilli())
	fmt.Println("+800的形式：", t2)
	fmt.Println("那天是周", int(t2.Weekday()))
	// 获取那年的第多少周，"2015 30"是个字符串，需要单独拿出周数：30
	w1 := fmt.Sprint(t2.ISOWeek())
	// 将字符串以空格分隔，得到一个切片，用下标拿出30
	w2 := strings.Split(w1, " ")
	fmt.Println("那年过了", w2[1], "周")
	// 用time.Since函数计算距离今天多少小时，再除以24，最后转化为int类型，得出距离今天的整天数
	days := int(time.Since(t2).Hours() / 24)
	fmt.Println("距离今天", days, "天")
}

// 阿飞老师的批改
// 基本逻辑都没啥问题，存在的小问题比较多，分别有：
// 1. 矩形的长宽应该是float类型；
// 2. 导入的包漏掉了math和strconv
// 3. 日期格式化还有一些小问题导致周数计算错误,注意时区的问题
